home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMDSMEN.C < prev    next >
C/C++ Source or Header  |  1992-04-17  |  5KB  |  111 lines

  1. /*************************************************************************
  2.  * FRMDSMEN.C - The frm_dsmenu() routine.
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6. #include "frmtypes.h"
  7.  
  8. #ifndef NULL
  9.   #define NULL 0L
  10. #endif
  11.  
  12. #ifndef TRUE
  13.   #define TRUE  1
  14.   #define FALSE 0
  15. #endif
  16.  
  17. static TEDINFO title_tedinfo = {
  18.   NULL, NULL, NULL, 3, 6, 2, 0x11F0, 0, -1,   1,   1
  19. };
  20.  
  21. static OBJECT menutree[] = {
  22.  { -1,  1,  2, G_BOX,      NONE,       NORMAL,   (long)(0x00FF1100L),       0x0000, 0x0000, 0x0001, 0x0016},
  23.  {  2, -1, -1, G_BOXTEXT,  NONE,       NORMAL,   (long)(&title_tedinfo),    0x0000, 0x0000, 0x0001, 0x0101},
  24.  {  0,  3, 22, G_IBOX,     NONE,       NORMAL,   (long)(0x00001100L),       0x0001, 0x0002, 0x0001, 0x0014},
  25.  {  4, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0000, 0x0001, 0x0001},
  26.  {  5, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0001, 0x0001, 0x0001},
  27.  {  6, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0002, 0x0001, 0x0001},
  28.  {  7, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0003, 0x0001, 0x0001},
  29.  {  8, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0004, 0x0001, 0x0001},
  30.  {  9, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0005, 0x0001, 0x0001},
  31.  { 10, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0006, 0x0001, 0x0001},
  32.  { 11, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0007, 0x0001, 0x0001},
  33.  { 12, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0008, 0x0001, 0x0001},
  34.  { 13, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0009, 0x0001, 0x0001},
  35.  { 14, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x000A, 0x0001, 0x0001},
  36.  { 15, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x000B, 0x0001, 0x0001},
  37.  { 16, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x000C, 0x0001, 0x0001},
  38.  { 17, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x000D, 0x0001, 0x0001},
  39.  { 18, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x000E, 0x0001, 0x0001},
  40.  { 19, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x000F, 0x0001, 0x0001},
  41.  { 20, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0010, 0x0001, 0x0001},
  42.  { 21, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0011, 0x0001, 0x0001},
  43.  { 22, -1, -1, G_BOXTEXT,  SELECTABLE, NORMAL,   (long)(0L),                0x0000, 0x0012, 0x0001, 0x0001},
  44.  {  2, -1, -1, G_BOXTEXT,  0x0021,     NORMAL,   (long)(0L),                0x0000, 0x0013, 0x0001, 0x0001}
  45. };
  46.  
  47. #define TITLE_BOX           1
  48. #define TEXT_BOX            2
  49. #define FIRST_TEXT_LINE     3
  50. #define LAST_TEXT_LINE     22
  51.  
  52. int frm_dsmenu(options, title, strings)
  53.     long options;
  54.     char *title;
  55.     char **strings;
  56. {
  57.     int             maxwidth;
  58.     int             numlines;
  59.     int             selection;
  60.     int             hhalf    = gl_hchar / 2;
  61.     register OBJECT *ptree   = menutree;
  62.     static int      initdone = FALSE;
  63.  
  64.     if (!(options & FRM_NODEFAULTS)) {
  65.         options |= (_FrmDefaults & FRM_DOPTIONBITS) | FRM_DEFAULT_DYNOPT;
  66.     }
  67.     options |= FRM_MANDATORY_DYNOPT;
  68.  
  69.     if (!initdone) {
  70.         initdone = TRUE;
  71.         rsc_treefix(ptree);
  72.     }
  73.  
  74.     if (title != NULL) {
  75.         ptree->ob_flags           = NORMAL;
  76.         ptree[TITLE_BOX].ob_flags = FRM_MOVER|TOUCHEXIT;
  77.         ptree[TEXT_BOX].ob_y      = ptree[TITLE_BOX].ob_height + hhalf;
  78.         title_tedinfo.te_ptext    = title;
  79.         maxwidth                  = strlen(title);
  80.     } else {
  81.         ptree->ob_flags           = FRM_MOVER|TOUCHEXIT;
  82.         ptree[TITLE_BOX].ob_flags = HIDETREE;
  83.         ptree[TEXT_BOX].ob_y      = hhalf;
  84.         maxwidth                  = 1;
  85.     }
  86.  
  87.     ptree->ob_state = (options & FRM_DSHADOWED) ? SHADOWED : NORMAL;
  88.  
  89.     numlines = _FrmDS2Obj(strings, &ptree[FIRST_TEXT_LINE], NULL, 
  90.                             &maxwidth, FRM_DSMAXSTRINGS);
  91.  
  92.     _FrmTrWidths(ptree, ROOT,     (maxwidth+2)*gl_wchar);
  93.     _FrmTrWidths(ptree, TEXT_BOX, maxwidth*gl_wchar);
  94.  
  95.     ptree[TEXT_BOX].ob_height = numlines * gl_hchar;
  96.     ptree->ob_height = ptree[TEXT_BOX].ob_height + ptree[TEXT_BOX].ob_y + hhalf;
  97.  
  98.     selection = frm_menu(options, ptree, SELECTED);
  99.  
  100.     if (selection > NO_OBJECT) {
  101.         ptree[selection].ob_state &= ~SELECTED;
  102.         selection -= FIRST_TEXT_LINE-1; // adjust to 1-based index.
  103.         if (selection == numlines) {    // last selection is returned as
  104.             selection = 0;              // zero; it s/b Cancel, Exit, etc.
  105.         }
  106.     }
  107.  
  108.     return selection;
  109. }
  110.  
  111.